package com.yupi.yupicturebackend.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 缓存清除注解
 * 用于在数据更新时清除相关缓存
 * 
 * @author yupi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheEvict {

    /**
     * 缓存key的前缀
     * @return key前缀
     */
    String key() default "";

    /**
     * 缓存key的参数名
     * 从方法参数中获取缓存key的参数名
     * @return 参数名数组
     */
    String[] keyParams() default {};

    /**
     * 是否清除所有相关缓存
     * @return true-清除所有，false-清除指定key
     */
    boolean allEntries() default false;

    /**
     * 缓存清除时机
     * @return 清除时机
     */
    EvictTiming timing() default EvictTiming.AFTER_SUCCESS;

    /**
     * 缓存清除时机枚举
     */
    enum EvictTiming {
        /**
         * 方法执行前清除
         */
        BEFORE,
        /**
         * 方法执行成功后清除
         */
        AFTER_SUCCESS,
        /**
         * 方法执行后清除（无论成功失败）
         */
        AFTER_ALWAYS
    }
}
